#ifndef ARVORE_H_
#define ARVORE_H_

#include <iostream>
#include <fstream>

#include "NoArvore.h"

/*--------------------------------------------
  Arvore Generica, onde cada no tem n filhos
---------------------------------------------*/
class Arvore
{
    public:

        /*--------------------------------------------
          Construtor...
        ---------------------------------------------*/
        Arvore();

        /*--------------------------------------------
          Destrutor...
        ---------------------------------------------*/
        ~Arvore();

        /*--------------------------------------------
          Insere elemento raiz da arvore
        ---------------------------------------------*/
        NoArvore* inserirRaiz(char *elemento);

        /*--------------------------------------------
          Retorna o elemento raiz da arvore
        ---------------------------------------------*/
        NoArvore* getRaiz();

        /*--------------------------------------------
          Insere um elemento como filho do noPai
        ---------------------------------------------*/
        NoArvore* inserirNo(NoArvore *noPai, const char *elemento);

        /*--------------------------------------------
          Insere um no como filho do noPai
        ---------------------------------------------*/
        NoArvore* inserirNo(NoArvore *noPai, NoArvore *noFilho);

        /*--------------------------------------------
          Exibe toda a arvore
        ---------------------------------------------*/
        void exibirArvore(std::ostream& saida);

        /*--------------------------------------------
          Insere noAtual na fila de impressao
        ---------------------------------------------*/
        void inserirFilaImpressao(NoArvore *noAtual);

        /*--------------------------------------------
          Carrega a fila de impressao
        ---------------------------------------------*/
        bool carregarFilaImpressao();

    private:

        NoArvore *raiz;                       // no raiz da arvore
        std::list<NoArvore *> mFilaImpressao; // armazena os nos da arvore na ordem em que serao impressos
};

#endif /*ARVORE_H_*/
